home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / ODF / Found / FWStream / SLObjReg.cpp < prev    next >
Encoding:
Text File  |  1996-09-17  |  8.8 KB  |  291 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                SLObjReg.cpp
  4. //    Release Version:    $ ODF 2 $
  5. //
  6. //    Copyright:    (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "FWFound.hpp"
  11.  
  12. #ifndef   FWPRIDEB_H
  13. #include "FWPriDeb.h"
  14. #endif
  15.  
  16. #ifndef   FWPRIMEM_H
  17. #include "FWPriMem.h"
  18. #endif
  19.  
  20. #ifndef SLMEMMGR_H
  21. #include "SLMemMgr.h"
  22. #endif
  23.  
  24. #ifndef FWODEXCE_H
  25. #include "FWODExce.h"
  26. #endif
  27.  
  28. #define SOM_Module_slobjreg_Source
  29. #include <SLObjReg.xih>
  30.  
  31. #ifdef FW_BUILD_MAC
  32. #pragma segment FWArchiv
  33. #endif
  34.  
  35. static void growList(FW_OBasicObjectRegistryData *somThis);
  36.  
  37.  
  38. //----------------------------------------------------------------------------------------
  39. //    FW_OObjectRegistry__RegisterObject
  40. //----------------------------------------------------------------------------------------
  41. /*
  42.  *  Register an object and returns the (unique) ID
  43.  */
  44. SOM_Scope FW_ObjectRegistry_ID  SOMLINK FW_OObjectRegistry__RegisterObject(FW_OObjectRegistry *somSelf, Environment *ev,
  45.         void* object)
  46. {
  47. FW_UNUSED(somSelf);
  48. FW_UNUSED(ev);
  49. FW_UNUSED(object);
  50.     return FW_kNotInRegistry;
  51. }
  52.  
  53.  
  54. //----------------------------------------------------------------------------------------
  55. //    FW_OObjectRegistry__RegisterObjectAndID
  56. //----------------------------------------------------------------------------------------
  57. /*
  58.  *  Register an object to particular id.
  59.  *  The id must not already be in the registry.
  60.  */
  61. SOM_Scope void  SOMLINK FW_OObjectRegistry__RegisterObjectAndID(FW_OObjectRegistry *somSelf, Environment *ev,
  62.         void* object,
  63.         FW_ObjectRegistry_ID id)
  64. {
  65. FW_UNUSED(somSelf);
  66. FW_UNUSED(ev);
  67. FW_UNUSED(object);
  68. FW_UNUSED(id);
  69. }
  70.  
  71.  
  72. //----------------------------------------------------------------------------------------
  73. //    FW_OObjectRegistry__LookupByObject
  74. //----------------------------------------------------------------------------------------
  75. /*
  76.  *  Look up an object in the registry, return kNonInRegistry if object not found.
  77.  */
  78. SOM_Scope FW_ObjectRegistry_ID  SOMLINK FW_OObjectRegistry__LookupByObject(FW_OObjectRegistry *somSelf, Environment *ev,
  79.         void* object)
  80. {
  81. FW_UNUSED(somSelf);
  82. FW_UNUSED(ev);
  83. FW_UNUSED(object);
  84.     return FW_kNotInRegistry;
  85. }
  86.  
  87.  
  88. //----------------------------------------------------------------------------------------
  89. //    FW_OObjectRegistry__LookupByID
  90. //----------------------------------------------------------------------------------------
  91. /*
  92.  *  Find an object by ID, return its pointer.
  93.  *  Return 0 if id not in registry.
  94.  */
  95. SOM_Scope void*  SOMLINK FW_OObjectRegistry__LookupByID(FW_OObjectRegistry *somSelf, Environment *ev,
  96.         FW_ObjectRegistry_ID id)
  97. {
  98. FW_UNUSED(somSelf);
  99. FW_UNUSED(ev);
  100. FW_UNUSED(id);
  101.     return 0;
  102. }
  103.  
  104.  
  105. //----------------------------------------------------------------------------------------
  106. //    FW_OObjectRegistry__somInit
  107. //----------------------------------------------------------------------------------------
  108. SOM_Scope void  SOMLINK FW_OObjectRegistry__somInit(FW_OObjectRegistry *somSelf)
  109. {
  110. FW_UNUSED(somSelf);
  111.  
  112. //   FW_OObjectRegistry_parent_SOMObject_somInit(somSelf);
  113. }
  114.  
  115.  
  116. //----------------------------------------------------------------------------------------
  117. //    FW_OObjectRegistrysomUninit
  118. //----------------------------------------------------------------------------------------
  119. SOM_Scope void  SOMLINK FW_OObjectRegistry__somUninit(FW_OObjectRegistry *somSelf)
  120. {
  121. FW_UNUSED(somSelf);
  122.  
  123. //    FW_OObjectRegistry_parent_SOMObject_somUninit(somSelf);
  124. }
  125.  
  126.  
  127. //----------------------------------------------------------------------------------------
  128. //    FW_OBasicObjectRegistry__somInit
  129. //----------------------------------------------------------------------------------------
  130. SOM_Scope void  SOMLINK FW_OBasicObjectRegistry__somInit(FW_OBasicObjectRegistry *somSelf)
  131. {
  132.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  133.  
  134. //    FW_OBasicObjectRegistry_parent_FW_OObjectRegistry_somInit(somSelf);
  135.  
  136.     somThis->fList = 0;
  137.     somThis->fListLength = 0;
  138.     somThis->fPhysicalListLength = 0;
  139.     somThis->fNextUnusedID = 1;
  140. }
  141.  
  142.  
  143. //----------------------------------------------------------------------------------------
  144. //    FW_OBasicObjectRegistry__somUninit
  145. //----------------------------------------------------------------------------------------
  146. SOM_Scope void  SOMLINK FW_OBasicObjectRegistry__somUninit(FW_OBasicObjectRegistry *somSelf)
  147. {
  148.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  149.  
  150.     FW_PrimitiveFreeBlock(somThis->fList);
  151.  
  152. //    FW_OBasicObjectRegistry_parent_FW_OObjectRegistry_somUninit(somSelf);
  153. }
  154.  
  155.  
  156. //----------------------------------------------------------------------------------------
  157. //    FW_OBasicObjectRegistry__RegisterObject
  158. //----------------------------------------------------------------------------------------
  159. SOM_Scope FW_ObjectRegistry_ID  SOMLINK FW_OBasicObjectRegistry__RegisterObject(FW_OBasicObjectRegistry *somSelf, Environment *ev,
  160.         void* object)
  161. {
  162.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  163.  
  164.     FW_SOM_TRY
  165.     {
  166.         FW_ASSERT(FW_OBasicObjectRegistry__LookupByObject(somSelf, ev, object) == FW_kNotInRegistry);
  167.         if (somThis->fListLength == somThis->fPhysicalListLength)
  168.         {
  169.             growList(somThis);
  170.     //        if (ev->_major != 0)
  171.     //            return FW_kNotInRegistry;
  172.         }
  173.     
  174.         long entry = somThis->fListLength++;
  175.         somThis->fList[entry].fObject = object;
  176.         while (FW_OBasicObjectRegistry__LookupByID(somSelf, ev, somThis->fNextUnusedID) != 0)
  177.             somThis->fNextUnusedID++;
  178.         somThis->fList[entry].fID = somThis->fNextUnusedID++;
  179.  
  180.         return somThis->fList[entry].fID;
  181.     }
  182.     FW_SOM_CATCH
  183.  
  184.     return FW_kNotInRegistry;
  185. }
  186.  
  187.  
  188. //----------------------------------------------------------------------------------------
  189. //    FW_OBasicObjectRegistry__RegisterObjectAndID
  190. //----------------------------------------------------------------------------------------
  191. SOM_Scope void  SOMLINK FW_OBasicObjectRegistry__RegisterObjectAndID(FW_OBasicObjectRegistry *somSelf, Environment *ev,
  192.         void* object,
  193.         FW_ObjectRegistry_ID id)
  194. {
  195.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  196.  
  197.     FW_SOM_TRY
  198.     {
  199. //        FW_ASSERT(FW_OBasicObjectRegistry__LookupByObject(somSelf, ev, object) == FW_kNotInRegistry);
  200.         FW_ASSERT(FW_OBasicObjectRegistry__LookupByID(somSelf, ev, id) == 0);
  201.     
  202.         if (somThis->fListLength == somThis->fPhysicalListLength)
  203.             growList(somThis);
  204.     
  205.         long entry = somThis->fListLength++;
  206.         somThis->fList[entry].fObject = object;
  207.         somThis->fList[entry].fID = id;
  208.     }
  209.     FW_SOM_CATCH
  210. }
  211.  
  212.  
  213. //----------------------------------------------------------------------------------------
  214. //    FW_OBasicObjectRegistry__LookupByObject
  215. //----------------------------------------------------------------------------------------
  216. SOM_Scope FW_ObjectRegistry_ID  SOMLINK FW_OBasicObjectRegistry__LookupByObject(FW_OBasicObjectRegistry *somSelf, Environment *ev,
  217.         void* object)
  218. {
  219. FW_UNUSED(ev);
  220.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  221.  
  222.     FW_ObjectRegistry_ID result = FW_kNotInRegistry;
  223.     for (long i = 0; i < somThis->fListLength; i++)
  224.     {
  225.         if (somThis->fList[i].fObject == object)
  226.         {
  227.             result = somThis->fList[i].fID;
  228.             break;
  229.         }
  230.     }
  231.  
  232.     return result;
  233. }
  234.  
  235.  
  236. //----------------------------------------------------------------------------------------
  237. //    FW_OBasicObjectRegistry__LookupByID
  238. //----------------------------------------------------------------------------------------
  239. SOM_Scope void*  SOMLINK FW_OBasicObjectRegistry__LookupByID(FW_OBasicObjectRegistry *somSelf, Environment *ev,
  240.         FW_ObjectRegistry_ID id)
  241. {
  242. FW_UNUSED(ev);
  243.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  244.  
  245.     void* result = 0;
  246.     for (long i = 0; i < somThis->fListLength; i++)
  247.     {
  248.         if (somThis->fList[i].fID == id)
  249.         {
  250.             result = somThis->fList[i].fObject;
  251.             break;
  252.         }
  253.     }
  254.  
  255.     return result;
  256. }
  257.  
  258.  
  259. //----------------------------------------------------------------------------------------
  260. //    growList
  261. //----------------------------------------------------------------------------------------
  262. /*
  263.  *  Grow the list by kExpansion slots
  264.  */
  265. static void growList(FW_OBasicObjectRegistryData *somThis)
  266. {
  267.     const int kExpansion = 8;
  268.     long bytesNeeded = (somThis->fPhysicalListLength+kExpansion) * sizeof(FW_OBasicObjectRegistry_SAssociation);
  269.  
  270.     if (somThis->fList == 0)
  271.         somThis->fList = (FW_OBasicObjectRegistry_SAssociation*) FW_PrimitiveAllocateBlock(bytesNeeded);
  272.     else
  273.         somThis->fList = (FW_OBasicObjectRegistry_SAssociation*) FW_PrimitiveResizeBlock(somThis->fList, bytesNeeded);
  274.  
  275.     if (somThis->fList == 0)
  276.     {
  277.         somThis->fPhysicalListLength = 0;
  278.         FW_Failure(FW_xMemoryExhausted);
  279.     }
  280.  
  281.     for (long i = somThis->fPhysicalListLength; i < somThis->fPhysicalListLength+kExpansion; i++)
  282.     {
  283.         somThis->fList[i].fID = FW_kNotInRegistry;
  284.         somThis->fList[i].fObject = 0;
  285.     }
  286.         
  287.     somThis->fPhysicalListLength += kExpansion;
  288. }
  289.  
  290.  
  291.